﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Monitor.Models.Json;

namespace Monitor.Controllers.ApiControllers.AccountManager
{
    /// <summary>
    /// Контроллер по управлению зонами
    /// </summary>
    public class UserAreaManagerController : MainApiController
    {
        // POST api/userareatree
        /// <summary>
        /// Реализация функции перемещения
        /// </summary>
        /// <param name="model">модель перемещаемого объекта</param>
        /// <returns>Ок - если все успешно, MethodNotAllowed - если недоступно, InternalServerError - в случае ошибки</returns>
        public HttpResponseMessage Post(string id, AddNewTreeItem model)
        {
            bool status = false;
            try
            {
                long pointId = 0;
                long masterId = 0;
                if (id.StartsWith("tree_"))//имеем дело с перемещением каталога
                {
                    if (long.TryParse(id.Substring(5), out pointId)
                        && model.MasterId.StartsWith("tree_")//перемещение возможно только в группу
                        && long.TryParse(model.MasterId.Substring(5), out masterId))
                    {
                        status = UserRepository.MoveZoneGroup(User.Identity.Name, pointId, masterId); //перемещение зоны
                    }
                }
                else
                {
                    if (long.TryParse(id, out pointId) 
                        && model.MasterId.StartsWith("tree_")//перемещение возможно только в группу
                        &&long.TryParse(model.MasterId.Substring(5), out masterId))
                    {
                        status = UserRepository.MoveZone(User.Identity.Name, pointId, masterId);//перемещение зоны
                    }
                }
            }
            catch (Exception e)
            {
                ErrorLogger.Fatal(this, e);
                return Request.CreateResponse(HttpStatusCode.InternalServerError);
            }
            return (status)
                       ? Request.CreateResponse(HttpStatusCode.OK)
                       : Request.CreateResponse(HttpStatusCode.MethodNotAllowed);
       
        }

        // PUT api/userareatree/5
        /// <summary>
        /// Функция добавление новой группы
        /// </summary>
        /// <param name="model">модель новой группы зон</param>
        /// <returns>Ок - если все успешно, MethodNotAllowed - если недоступно, InternalServerError - в случае ошибки</returns>
        public HttpResponseMessage Put(NewZoneItem model)
        {
            bool status = false;
            long masterId = 0;
            try
            {
                //если работа связана с каталогами/перемещением
                if (string.IsNullOrEmpty(model.Coord) 
                    && model.CarId==null)
                {
                        //корректный MasterId
                        if (string.IsNullOrEmpty(model.ParentId)&&//если вставка нового каталога
                            !string.IsNullOrEmpty(model.MasterId)
                            && model.MasterId.StartsWith("tree_")
                            && long.TryParse(model.MasterId.Substring(5), out masterId))
                        {
                            status = UserRepository.AddNewZoneGroup(User.Identity.Name,model.Label,masterId);//добавление группы зон
                        }


                }
                else
                { 
                    if (!string.IsNullOrEmpty(model.MasterId)//работа по вставке новых зон
                        && model.MasterId.StartsWith("tree_")//корректный MasterId
                        && long.TryParse(model.MasterId.Substring(5), out masterId))
                    {
                        status = UserRepository.AddNewZone(User.Identity.Name, masterId, model);
                    }
                }

            }
            catch (Exception e)
            {
                ErrorLogger.Fatal(this, e);
                return Request.CreateResponse(HttpStatusCode.InternalServerError);
            }
            return (status)
                       ? Request.CreateResponse(HttpStatusCode.OK)
                       : Request.CreateResponse(HttpStatusCode.MethodNotAllowed);
        }

        // DELETE api/userareatree/5
        public HttpResponseMessage Delete(string id)
        {
            bool status = false;
            try
            {
                long pointId = 0;
                    //удаление группы зон
                if (!string.IsNullOrEmpty(id)
                    && id.StartsWith("tree_")
                    && long.TryParse(id.Substring(5), out pointId))
                {
                    status = UserRepository.RemoveZoneGroup(User.Identity.Name, pointId);
                }
                else if (long.TryParse(id, out pointId))//если это зона
                {
                    status = UserRepository.RemoveZone(User.Identity.Name, pointId);
                }
            }
            catch (Exception e)
            {
                ErrorLogger.Fatal(this, e);
                return Request.CreateResponse(HttpStatusCode.InternalServerError);
            }
            return (status)
                       ? Request.CreateResponse(HttpStatusCode.OK)
                       : Request.CreateResponse(HttpStatusCode.MethodNotAllowed);
        }
    }
}
